<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en-US">
<head>
<!-- GenHTML revision 25226-->
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>Entity Inheritance - The Java EE 6 Tutorial</title>
<meta name="robots" content="index,follow">
<meta name="robots" content="index,follow">
<meta name="date" content="2011-03-01">
<link rel="stylesheet" type="text/css" href="css/default.css">
<link rel="stylesheet" type="text/css" href="css/ipg.css">
<link rel="stylesheet" type="text/css" href="css/javaeetutorial.css">
</head>

<body>

<table border="0" cellpadding="5" cellspacing="0" width="100%">
<tbody>
   <tr valign="top">
      <td width="400px"><p class="toc level1"><a href="docinfo.html">Document Information</a></p>
<p class="toc level1 tocsp"><a href="gexaf.html">Preface</a></p>
<p class="toc level1 tocsp"><a href="gfirp.html">Part&nbsp;I&nbsp;Introduction</a></p>
<p class="toc level2"><a href="bnaaw.html">1.&nbsp;&nbsp;Overview</a></p>
<p class="toc level2"><a href="gfiud.html">2.&nbsp;&nbsp;Using the Tutorial Examples</a></p>
<p class="toc level1 tocsp"><a href="bnadp.html">Part&nbsp;II&nbsp;The Web Tier</a></p>
<p class="toc level2"><a href="bnadr.html">3.&nbsp;&nbsp;Getting Started with Web Applications</a></p>
<p class="toc level2"><a href="bnaph.html">4.&nbsp;&nbsp;JavaServer Faces Technology</a></p>
<p class="toc level2"><a href="giepx.html">5.&nbsp;&nbsp;Introduction to Facelets</a></p>
<p class="toc level2"><a href="gjddd.html">6.&nbsp;&nbsp;Expression Language</a></p>
<p class="toc level2"><a href="bnaqz.html">7.&nbsp;&nbsp;Using JavaServer Faces Technology in Web Pages</a></p>
<p class="toc level2"><a href="gjcut.html">8.&nbsp;&nbsp;Using Converters, Listeners, and Validators</a></p>
<p class="toc level2"><a href="bnatx.html">9.&nbsp;&nbsp;Developing with JavaServer Faces Technology</a></p>
<p class="toc level2"><a href="gkmaa.html">10.&nbsp;&nbsp;JavaServer Faces Technology Advanced Concepts</a></p>
<p class="toc level2"><a href="bnawo.html">11.&nbsp;&nbsp;Configuring JavaServer Faces Applications</a></p>
<p class="toc level2"><a href="gkiow.html">12.&nbsp;&nbsp;Using Ajax with JavaServer Faces Technology</a></p>
<p class="toc level2"><a href="gkhxa.html">13.&nbsp;&nbsp;Advanced Composite Components</a></p>
<p class="toc level2"><a href="bnavg.html">14.&nbsp;&nbsp;Creating Custom UI Components</a></p>
<p class="toc level2"><a href="bnafd.html">15.&nbsp;&nbsp;Java Servlet Technology</a></p>
<p class="toc level2"><a href="bnaxu.html">16.&nbsp;&nbsp;Internationalizing and Localizing Web Applications</a></p>
<p class="toc level1 tocsp"><a href="bnayk.html">Part&nbsp;III&nbsp;Web Services</a></p>
<p class="toc level2"><a href="gijti.html">17.&nbsp;&nbsp;Introduction to Web Services</a></p>
<p class="toc level2"><a href="bnayl.html">18.&nbsp;&nbsp;Building Web Services with JAX-WS</a></p>
<p class="toc level2"><a href="giepu.html">19.&nbsp;&nbsp;Building RESTful Web Services with JAX-RS</a></p>
<p class="toc level2"><a href="gjjxe.html">20.&nbsp;&nbsp;Advanced JAX-RS Features</a></p>
<p class="toc level2"><a href="gkojl.html">21.&nbsp;&nbsp;Running the Advanced JAX-RS Example Application</a></p>
<p class="toc level1 tocsp"><a href="bnblr.html">Part&nbsp;IV&nbsp;Enterprise Beans</a></p>
<p class="toc level2"><a href="gijsz.html">22.&nbsp;&nbsp;Enterprise Beans</a></p>
<p class="toc level2"><a href="gijre.html">23.&nbsp;&nbsp;Getting Started with Enterprise Beans</a></p>
<p class="toc level2"><a href="gijrb.html">24.&nbsp;&nbsp;Running the Enterprise Bean Examples</a></p>
<p class="toc level2"><a href="bnbpk.html">25.&nbsp;&nbsp;A Message-Driven Bean Example</a></p>
<p class="toc level2"><a href="gkcqz.html">26.&nbsp;&nbsp;Using the Embedded Enterprise Bean Container</a></p>
<p class="toc level2"><a href="gkidz.html">27.&nbsp;&nbsp;Using Asynchronous Method Invocation in Session Beans</a></p>
<p class="toc level1 tocsp"><a href="gjbnr.html">Part&nbsp;V&nbsp;Contexts and Dependency Injection for the Java EE Platform</a></p>
<p class="toc level2"><a href="giwhb.html">28.&nbsp;&nbsp;Introduction to Contexts and Dependency Injection for the Java EE Platform</a></p>
<p class="toc level2"><a href="gjbls.html">29.&nbsp;&nbsp;Running the Basic Contexts and Dependency Injection Examples</a></p>
<p class="toc level2"><a href="gjehi.html">30.&nbsp;&nbsp;Contexts and Dependency Injection for the Java EE Platform: Advanced Topics</a></p>
<p class="toc level2"><a href="gkhre.html">31.&nbsp;&nbsp;Running the Advanced Contexts and Dependency Injection Examples</a></p>
<p class="toc level1 tocsp"><a href="bnbpy.html">Part&nbsp;VI&nbsp;Persistence</a></p>
<p class="toc level2"><a href="bnbpz.html">32.&nbsp;&nbsp;Introduction to the Java Persistence API</a></p>
<p class="toc level3"><a href="bnbqa.html">Entities</a></p>
<p class="toc level4"><a href="bnbqa.html#bnbqb">Requirements for Entity Classes</a></p>
<p class="toc level4"><a href="bnbqa.html#bnbqc">Persistent Fields and Properties in Entity Classes</a></p>
<p class="toc level5"><a href="bnbqa.html#bnbqd">Persistent Fields</a></p>
<p class="toc level5"><a href="bnbqa.html#bnbqe">Persistent Properties</a></p>
<p class="toc level5"><a href="bnbqa.html#giqvn">Using Collections in Entity Fields and Properties</a></p>
<p class="toc level5"><a href="bnbqa.html#gkahq">Validating Persistent Fields and Properties</a></p>
<p class="toc level4 tocsp"><a href="bnbqa.html#bnbqf">Primary Keys in Entities</a></p>
<p class="toc level4"><a href="bnbqa.html#bnbqh">Multiplicity in Entity Relationships</a></p>
<p class="toc level4"><a href="bnbqa.html#bnbqi">Direction in Entity Relationships</a></p>
<p class="toc level5"><a href="bnbqa.html#bnbqj">Bidirectional Relationships</a></p>
<p class="toc level5"><a href="bnbqa.html#bnbqk">Unidirectional Relationships</a></p>
<p class="toc level5"><a href="bnbqa.html#bnbql">Queries and Relationship Direction</a></p>
<p class="toc level5"><a href="bnbqa.html#bnbqm">Cascade Operations and Relationships</a></p>
<p class="toc level5"><a href="bnbqa.html#giqxy">Orphan Removal in Relationships</a></p>
<p class="toc level4 tocsp"><a href="bnbqa.html#gjiwz">Embeddable Classes in Entities</a></p>
<div id="scrolltoc" class="onpage">
<p class="toc level3 tocsp"><a href="">Entity Inheritance</a></p>
<p class="toc level4"><a href="#bnbqo">Abstract Entities</a></p>
<p class="toc level4"><a href="#bnbqp">Mapped Superclasses</a></p>
<p class="toc level4"><a href="#bnbqq">Non-Entity Superclasses</a></p>
<p class="toc level4"><a href="#bnbqr">Entity Inheritance Mapping Strategies</a></p>
<p class="toc level5"><a href="#bnbqs">The Single Table per Class Hierarchy Strategy</a></p>
<p class="toc level5"><a href="#bnbqu">The Table per Concrete Class Strategy</a></p>
<p class="toc level5"><a href="#bnbqv">The Joined Subclass Strategy</a></p>
</div>
<p class="toc level3 tocsp"><a href="bnbqw.html">Managing Entities</a></p>
<p class="toc level4"><a href="bnbqw.html#bnbqy">The <tt>EntityManager</tt> Interface</a></p>
<p class="toc level5"><a href="bnbqw.html#bnbqz">Container-Managed Entity Managers</a></p>
<p class="toc level5"><a href="bnbqw.html#bnbra">Application-Managed Entity Managers</a></p>
<p class="toc level5"><a href="bnbqw.html#bnbrb">Finding Entities Using the <tt>EntityManager</tt></a></p>
<p class="toc level5"><a href="bnbqw.html#bnbrc">Managing an Entity Instance's Lifecycle</a></p>
<p class="toc level5"><a href="bnbqw.html#bnbrd">Persisting Entity Instances</a></p>
<p class="toc level5"><a href="bnbqw.html#bnbre">Removing Entity Instances</a></p>
<p class="toc level5"><a href="bnbqw.html#bnbrf">Synchronizing Entity Data to the Database</a></p>
<p class="toc level4 tocsp"><a href="bnbqw.html#bnbrj">Persistence Units</a></p>
<p class="toc level3 tocsp"><a href="gjise.html">Querying Entities</a></p>
<p class="toc level3"><a href="gkclc.html">Further Information about Persistence</a></p>
<p class="toc level2 tocsp"><a href="gijst.html">33.&nbsp;&nbsp;Running the Persistence Examples</a></p>
<p class="toc level2"><a href="bnbtg.html">34.&nbsp;&nbsp;The Java Persistence Query Language</a></p>
<p class="toc level2"><a href="gjitv.html">35.&nbsp;&nbsp;Using the Criteria API to Create Queries</a></p>
<p class="toc level2"><a href="gkjiq.html">36.&nbsp;&nbsp;Creating and Using String-Based Criteria Queries</a></p>
<p class="toc level2"><a href="gkjjf.html">37.&nbsp;&nbsp;Controlling Concurrent Access to Entity Data with Locking</a></p>
<p class="toc level2"><a href="gkjia.html">38.&nbsp;&nbsp;Improving the Performance of Java Persistence API Applications By Setting a Second-Level Cache</a></p>
<p class="toc level1 tocsp"><a href="gijrp.html">Part&nbsp;VII&nbsp;Security</a></p>
<p class="toc level2"><a href="bnbwj.html">39.&nbsp;&nbsp;Introduction to Security in the Java EE Platform</a></p>
<p class="toc level2"><a href="bncas.html">40.&nbsp;&nbsp;Getting Started Securing Web Applications</a></p>
<p class="toc level2"><a href="bnbyk.html">41.&nbsp;&nbsp;Getting Started Securing Enterprise Applications</a></p>
<p class="toc level1 tocsp"><a href="gijue.html">Part&nbsp;VIII&nbsp;Java EE Supporting Technologies</a></p>
<p class="toc level2"><a href="gijto.html">42.&nbsp;&nbsp;Introduction to Java EE Supporting Technologies</a></p>
<p class="toc level2"><a href="bncih.html">43.&nbsp;&nbsp;Transactions</a></p>
<p class="toc level2"><a href="bncjh.html">44.&nbsp;&nbsp;Resource Connections</a></p>
<p class="toc level2"><a href="bncdq.html">45.&nbsp;&nbsp;Java Message Service Concepts</a></p>
<p class="toc level2"><a href="bncgv.html">46.&nbsp;&nbsp;Java Message Service Examples</a></p>
<p class="toc level2"><a href="gkahp.html">47.&nbsp;&nbsp;Advanced Bean Validation Concepts and Examples</a></p>
<p class="toc level2"><a href="gkeed.html">48.&nbsp;&nbsp;Using Java EE Interceptors</a></p>
<p class="toc level1 tocsp"><a href="gkgjw.html">Part&nbsp;IX&nbsp;Case Studies</a></p>
<p class="toc level2"><a href="gkaee.html">49.&nbsp;&nbsp;Duke's Tutoring Case Study Example</a></p>
<p class="toc level1 tocsp"><a href="idx-1.html">Index</a></p>
</td>
      <td width="10px">&nbsp;</td>
      <td>
         <div class="header">
             <div class="banner">
                <table width="100%" border="0" cellpadding="5" cellspacing="0">
                   <tbody>
                      <tr>
                         <td valign="bottom"><p class="Banner">The Java EE 6 Tutorial
</p></td>
                         <td align="right"  valign="bottom"><img src="graphics/javalogo.png" alt="Java Coffee Cup logo"></td>
                      </tr>
                   </tbody>
                </table>
             </div>

             <div class="header-links">
	         <a href="./index.html">Home</a> | 
<a href="../information/download.html">Download</a> | 
<a href="./javaeetutorial6.pdf">PDF</a> | 
<a href="../information/faq.html">FAQ</a> | 
<a href="http://download.oracle.com/javaee/feedback.htm">Feedback</a>

             </div>
             <div class="navigation">
                 <a href="bnbqa.html"><img src="graphics/leftButton.gif" border="0" alt="Previous" title="Previous"></a>
                 <a href="p1.html"><img src="graphics/upButton.gif" border="0" alt="Contents" title="Contents"></a>
                 <a href="bnbqw.html"><img src="graphics/rightButton.gif" border="0" alt="Next" title="Next"></a>
             </div>
         </div>

	 <div class="maincontent">      	 
             

<a name="bnbqn"></a><h2>Entity Inheritance</h2>
<a name="indexterm-1643"></a><p>Entities support class inheritance, polymorphic associations, and polymorphic queries. Entity classes can extend
non-entity classes, and non-entity classes can extend entity classes. Entity classes can be
both abstract and concrete.</p>

<p>The <tt>roster</tt> example application demonstrates entity inheritance, as described in <a href="giqsq.html#giqrf">Entity Inheritance in the <tt>roster</tt> Application</a>.</p>



<a name="bnbqo"></a><h3>Abstract Entities</h3>
<a name="indexterm-1644"></a><p>An abstract class may be declared an entity by decorating the class with
<tt>@Entity</tt>. Abstract entities are like concrete entities but cannot be instantiated.</p>

<p>Abstract entities can be queried just like concrete entities. If an abstract entity
is the target of a query, the query operates on all the
concrete subclasses of the abstract entity:</p>

<pre>@Entity
public abstract class Employee {
    @Id
    protected Integer employeeId;
    ...
}
@Entity
public class FullTimeEmployee extends Employee {
    protected Integer salary;
    ...
}
@Entity
public class PartTimeEmployee extends Employee {
    protected Float hourlyWage;
}</pre>

<a name="bnbqp"></a><h3>Mapped Superclasses</h3>
<a name="indexterm-1645"></a><p>Entities may inherit from superclasses that contain persistent state and mapping information but
are not entities. That is, the superclass is not decorated with the <tt>@Entity</tt>
annotation and is not mapped as an entity by the Java Persistence provider.
These superclasses are most often used when you have state and mapping information
common to multiple entity classes.</p>

<p>Mapped superclasses are specified by decorating the class with the annotation <tt>javax.persistence.MappedSuperclass</tt>:</p>

<pre>@MappedSuperclass
public class Employee {
    @Id
    protected Integer employeeId;
    ...
}
@Entity
public class FullTimeEmployee extends Employee {
    protected Integer salary;
    ...
}
@Entity
public class PartTimeEmployee extends Employee {
    protected Float hourlyWage;
    ...
}</pre><p>Mapped superclasses cannot be queried and can&rsquo;t be used in <tt>EntityManager</tt> or
<tt>Query</tt> operations. You must use entity subclasses of the mapped superclass in <tt>EntityManager</tt>
or <tt>Query</tt> operations. Mapped superclasses can&rsquo;t be targets of entity relationships. Mapped superclasses can
be abstract or concrete.</p>

<p>Mapped superclasses do not have any corresponding tables in the underlying datastore. Entities
that inherit from the mapped superclass define the table mappings. For instance, in
the preceding code sample, the underlying tables would be <tt>FULLTIMEEMPLOYEE</tt> and <tt>PARTTIMEEMPLOYEE</tt>, but there
is no <tt>EMPLOYEE</tt> table.</p>



<a name="bnbqq"></a><h3>Non-Entity Superclasses</h3>
<a name="indexterm-1646"></a><p>Entities may have non-entity superclasses, and these superclasses can be either abstract or
concrete. The state of non-entity superclasses is nonpersistent, and any state inherited from
the non-entity superclass by an entity class is nonpersistent. Non-entity superclasses may not
be used in <tt>EntityManager</tt> or <tt>Query</tt> operations. Any mapping or relationship annotations in
non-entity superclasses are ignored.</p>



<a name="bnbqr"></a><h3>Entity Inheritance Mapping Strategies</h3>
<a name="indexterm-1647"></a><p>You can configure how the Java Persistence provider maps inherited entities to the
underlying datastore by decorating the root class of the hierarchy with the annotation
<tt>javax.persistence.Inheritance</tt>. The following mapping strategies are used to map the entity data to
the underlying database:</p>


<ul><li><p>A single table per class hierarchy</p>

</li>
<li><p>A table per concrete entity class</p>

</li>
<li><p>A &ldquo;join&rdquo; strategy, whereby fields or properties that are specific to a subclass are mapped to a different table than the fields or properties that are common to the parent class</p>

</li></ul>
<p>The strategy is configured by setting the <tt>strategy</tt> element of <tt>@Inheritance</tt> to one
of the options defined in the <tt>javax.persistence.InheritanceType</tt> enumerated type:</p>

<pre>public enum InheritanceType {
    SINGLE_TABLE,
    JOINED,
    TABLE_PER_CLASS
};</pre><p>The default strategy, <tt>InheritanceType.SINGLE_TABLE</tt>, is used if the <tt>@Inheritance</tt> annotation is not specified on
the root class of the entity hierarchy.</p>



<a name="bnbqs"></a><h4>The Single Table per Class Hierarchy Strategy</h4>
<a name="indexterm-1648"></a><a name="indexterm-1649"></a><p><a name="indexterm-1650"></a>With this strategy, which corresponds to the default <tt>InheritanceType.SINGLE_TABLE</tt>, all classes in
the hierarchy are mapped to a single table in the database. This table
has a <b>discriminator column</b> containing a value that identifies the subclass to which the
instance represented by the row belongs.</p>

<p>The discriminator column, whose elements are shown in <a href="#bnbqt">Table&nbsp;32-2</a>, can be specified
by using the <tt>javax.persistence.DiscriminatorColumn</tt> annotation on the root of the entity class hierarchy.</p>

<a name="bnbqt"></a><p class="caption">Table&nbsp;32-2 <tt>@DiscriminatorColumn</tt> Elements</p><table><col width="21%"><col width="22%"><col width="55%"><tr><th align="left" valign="top" scope="column"><p>Type</p>

</th>
<th align="left" valign="top" scope="column"><p>Name</p>

</th>
<th align="left" valign="top" scope="column"><p>Description</p>

</th>
</tr>
<tr><td align="left" valign="top" scope="row"><p><tt>String</tt></p>

</td>
<td align="left" valign="top" scope="row"><p><tt>name</tt></p>

</td>
<td align="left" valign="top" scope="row"><p>The name
of the column to be used as the discriminator column. The default is
<tt>DTYPE</tt>. This element is optional.</p>

</td>
</tr>
<tr><td align="left" valign="top" scope="row"><p><tt>DiscriminatorType</tt></p>

</td>
<td align="left" valign="top" scope="row"><p><tt>discriminatorType</tt></p>

</td>
<td align="left" valign="top" scope="row"><p>The type of the column to be used
as a discriminator column. The default is <tt>DiscriminatorType.STRING</tt>. This element is optional.</p>

</td>
</tr>
<tr><td align="left" valign="top" scope="row"><p><tt>String</tt></p>

</td>
<td align="left" valign="top" scope="row"><p><tt>columnDefinition</tt></p>

</td>
<td align="left" valign="top" scope="row"><p>The SQL
fragment to use when creating the discriminator column. The default is generated by
the Persistence provider and is implementation-specific. This element is optional.</p>

</td>
</tr>
<tr><td align="left" valign="top" scope="row"><p><tt>String</tt></p>

</td>
<td align="left" valign="top" scope="row"><p><tt>length</tt></p>

</td>
<td align="left" valign="top" scope="row"><p>The column length for
<tt>String</tt>-based discriminator types. This element is ignored for non-<tt>String</tt> discriminator types. The default is
31. This element is optional.</p>

</td>
</tr>
</table><p>The <tt>javax.persistence.DiscriminatorType</tt> enumerated type is used to set the type of the discriminator
column in the database by setting the <tt>discriminatorType</tt> element of <tt>@DiscriminatorColumn</tt> to one
of the defined types. <tt>DiscriminatorType</tt> is defined as:</p>

<pre>public enum DiscriminatorType {
    STRING,
    CHAR,
    INTEGER
};</pre><p>If <tt>@DiscriminatorColumn</tt> is not specified on the root of the entity hierarchy and
a discriminator column is required, the Persistence provider assumes a default column name
of <tt>DTYPE</tt> and column type of <tt>DiscriminatorType.STRING</tt>.</p>

<p>The <tt>javax.persistence.DiscriminatorValue</tt> annotation may be used to set the value entered into the
discriminator column for each entity in a class hierarchy. You may decorate only
concrete entity classes with <tt>@DiscriminatorValue</tt>.</p>

<p>If <tt>@DiscriminatorValue</tt> is not specified on an entity in a class hierarchy that
uses a discriminator column, the Persistence provider will provide a default, implementation-specific value.
If the <tt>discriminatorType</tt> element of <tt>@DiscriminatorColumn</tt> is <tt>DiscriminatorType.STRING</tt>, the default value is
the name of the entity.</p>

<p>This strategy provides good support for polymorphic relationships between entities and queries that
cover the entire entity class hierarchy. However, this strategy requires the columns that
contain the state of subclasses to be nullable.</p>



<a name="bnbqu"></a><h4>The Table per Concrete Class Strategy</h4>
<p>In this strategy, which corresponds to <tt>InheritanceType.TABLE_PER_CLASS</tt>, each concrete class is mapped
to a separate table in the database. All fields or properties in the
class, including inherited fields or properties, are mapped to columns in the class&rsquo;s
table in the database.</p>

<p>This strategy provides poor support for polymorphic relationships and usually requires either SQL
<tt>UNION</tt> queries or separate SQL queries for each subclass for queries that cover
the entire entity class hierarchy.</p>

<p>Support for this strategy is optional and may not be supported by
all Java Persistence API providers. The default Java Persistence API provider in the GlassFish
Server does not support this strategy.</p>



<a name="bnbqv"></a><h4>The Joined Subclass Strategy</h4>
<p>In this strategy, which corresponds to <tt>InheritanceType.JOINED</tt>, the root of the class hierarchy
is represented by a single table, and each subclass has a separate table
that contains only those fields specific to that subclass. That is, the subclass
table does not contain columns for inherited fields or properties. The subclass table
also has a column or columns that represent its primary key, which is
a foreign key to the primary key of the superclass table.</p>

<p>This strategy provides good support for polymorphic relationships but requires one or more
join operations to be performed when instantiating entity subclasses. This may result in
poor performance for extensive class hierarchies. Similarly, queries that cover the entire class
hierarchy require join operations between the subclass tables, resulting in decreased performance.</p>

<p>Some Java Persistence API providers, including the default provider in the GlassFish Server,
require a discriminator column that corresponds to the root entity when using the
joined subclass strategy. If you are not using automatic table creation in your
application, make sure that the database table is set up correctly for the
discriminator column defaults, or use the <tt>@DiscriminatorColumn</tt> annotation to match your database
schema. For information on discriminator columns, see <a href="#bnbqs">The Single Table per Class Hierarchy Strategy</a>.</p>


         </div>
         <div class="navigation">
             <a href="bnbqa.html"><img src="graphics/leftButton.gif" border="0" alt="Previous" title="Previous"></a>
             <a href="p1.html"><img src="graphics/upButton.gif" border="0" alt="Contents" title="Contents"></a>
             <a href="bnbqw.html"><img src="graphics/rightButton.gif" border="0" alt="Next" title="Next"></a>
         </div>

         <div class="copyright">
      	    <p>Copyright &copy; 2011, Oracle and/or its affiliates. All rights reserved. <a href="docinfo.html">Legal Notices</a></p>
      	 </div>

      </td>
   </tr>
</tbody>
</table>
</body>
</html>

